#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN=10050;
struct node{
    char name[25];
    int rp;
    //重载小于号 改成大于的比较 这样人品值低的在前面
    bool operator < (const node& x) const{
        return rp>x.rp || (rp==x.rp && strcmp(name,x.name)<0);
    }
};
priority_queue<node> t[MAXN];
int main(void){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<MAXN;i++){
            while(!t[i].empty()){
                t[i].pop();
            }
        }
        for(int i=1;i<=n;i++){
            int p;
            scanf("%d",&p);
            char name[25];
            int rp;
            for(int j=0;j<p;j++){
                scanf("%s %d",name,&rp);
                node tmp;
                tmp.rp=rp;
                strcpy(tmp.name,name);
                t[i].push(tmp);
            }
        }
        char q[10];
        int k;
        char name[25];
        int rp;
        int a,b;
        while(m--){
            scanf("%s",q);
            if(q[0]=='G'){
                if(q[4]=='U'){
                    scanf("%d",&k);
                    printf("%s\n",t[k].top().name);
                    t[k].pop();
                }
                else if(q[4]=='N'){
                    scanf("%d %s %d",&k,name,&rp);
                    node tmp;
                    tmp.rp=rp;
                    strcpy(tmp.name,name);
                    t[k].push(tmp);
                }
            }
            else if(q[0]=='J'){
                scanf("%d%d",&a,&b);
                while(!t[b].empty()){
                    t[a].push(t[b].top());
                    t[b].pop();
                }
            }
        }
    }
    return 0;
}
